#include <iostream>
#include <vector>
using namespace std;
int N,M,time,stack_size;
int mark[3000],dfn[3000],low[3000],stack[3000];
vector<int> G[3000];
void tarjan(int V);
int main()
{
    
    cin>>N>>M;
    for(int i=0;i<M;i++)
    {
        int bill_1,bill_2;
        char vote_1,vote_2;
        cin>>bill_1>>vote_1>>bill_2>>vote_2;
        if((vote_1=='Y')^(vote_2=='Y'))
        {
            G[bill_1].push_back(bill_2+N);
            G[bill_1+N].push_back(bill_2);
        }
        else
        {
            G[bill_1].push_back(bill_2);
            G[bill_1].push_back(bill_2);
        }
    }
    for(int i=1;i<=2*N;i++)
    {
        if(!dfn[i])	tarjan(i);
    }
    for(int i=1;i<=N;i++)
    {
        if(mark[i]==mark[i+N])	
        {
            cout<<"IMPOSSIBLE";
            return 0;
        }
    }
    return 0;
}
void tarjan(int V)
{
    time++;
    dfn[V]=time;
    low[V]=time;
    stack[stack_size++]=V;
    for(int i=0;i<G[V].size();i++)
    {
        int K=G[V][i];
        if(dfn[K]==0)
        {
            tarjan(K);
            low[V]=min(low[V],low[K]);
        }
        else if(mark[K]==0)		low[V]=min(low[V],dfn[K]);
    }
    if(low[V]==dfn[V])
    {
        int U;
        do
        {
            U=stack[--stack_size];
            mark[U]=V;
        }
        while(V!=U);
    }	
}